import { reqOrderAddress, reqOrderInfo, reqBuyNowGoods, reqSubmitOrder, reqPrePayInfo, reqPayStatus } from '../../../api/orderpay'
import { formatTime } from '../../../utils/formatTime'
import Schema from 'async-validator'
import { toast } from '../../../../../utils/expendApi'
import { debounce } from 'miniprogram-licia'
const app = getApp()
Page({
  data: {
    buyName: '', // 订购人姓名
    buyPhone: '', // 订购人手机号
    deliveryDate: '', // 期望送达日期
    blessing: '', // 祝福语
    show: false, // 期望送达日期弹框
    minDate: new Date().getTime(),
    orderAddress: '', //收货地址
    orderInfo: {}, // 订单商品详情
  },
  // 跳转到收货地址
  toAddress() {
    wx.navigateTo({
      url: '/modules/settingModule/pages/address/list/index'
    })
  },
  // 获取收货地址订单
  async getAddress () {
    //判断全局共享的address 如果存在就需要从全局共享中取到数据
    if(app.globalData.address.id) {
      this.setData({
        orderAddress: app.globalData.address
      })
      return
    }
    const { data:orderAddress } = await reqOrderAddress()
    this.setData({orderAddress})
  },
  // 获取订单详情
  async getOrderInfo () {
    const { goodsId, blessing } =  this.data
    const { data:orderInfo } = goodsId?await reqBuyNowGoods({goodsId, blessing}) : await reqOrderInfo()
    // 判断是否有祝福语 如果需要购买的是多个商品 选出第一个祝福语
    const orderGoods = orderInfo.cartVoList.find(item => item.blessing !== '')
    this.setData({ 
      orderInfo,
      blessing: !orderGoods?'':orderGoods.blessing
     })
  },
  // 弹出日期选择
  onShowDateTimerPopUp() {
    this.setData({
      show: true
    })
  },
 // 取消选择日期以及 关闭弹框时触发
 onCancelTimePicker() {
  this.setData({
    show: false,
    minDate: new Date().getTime(),
    currentDate: new Date().getTime()
  })
},
  // 确定日期选择
  onConfirmTimerPicker (event) {
    // vant组件提供的时间选择组件 获得的事时间戳
    // console.log(event)
    // 时间戳转化成 日期对象
    const timeRes = formatTime(new Date(event.detail))
    this.setData({
      show: false,
      deliveryDate: timeRes
    })
  },
  
  // 验证信息
  validatorPerson (params) {
    // 验证收货人，是否只包含大小写字母、数字和中文字符
    const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'

    // 验证手机号，是否符合中国大陆手机号码的格式
    const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'
    
     // 创建验证规则
     const rules = {
      userAddressId: {
        required: true, message: '请选择收货地址'
      },
      buyName: [
        { required: true, message: '请输入订购人姓名' },
        { pattern: nameRegExp, message: '订购人姓名不合法'}
      ],
      buyPhone: [
        { required: true, message: '请输入订购人手机号' },
        { pattern: phoneReg, message: '订购人手机号不合法'}
      ],
      deliveryDate: {
        required: true, message: '请选择送达日期'
      },
     }
     // 传入验证规则 进行实例化
    const validator = new Schema(rules)
    // 调用实例方法 进行验证 希望将结果通过promise返回
    return new Promise((resolve) => {
      validator.validate(params, (errors, fields) => {
        if(errors) {
          // 验证失败
          toast({title: errors[0].message})
          // 如果属性值是false,说明验证失败
          resolve({ valid: false})
        } else {
          resolve({ valid: true })
        }
      })
    })
  },
  // 提交订单
  submitOrder: debounce(async function (){
    const { buyName, buyPhone, deliveryDate, blessing, orderAddress, orderInfo } = this.data
    const params = {
      buyName,
      buyPhone,
      cartList: orderInfo.cartVoList,
      deliveryDate,
      remarks: blessing,
      userAddressId: orderAddress.id
    }
    // 请求参数验证
    const { valid } =  await this.validatorPerson(params)
    if(!valid) return 
    const res = await reqSubmitOrder(params)
    if(res.code === 200) {
      // 平台订单创建成功 将返回的订单编号挂载到页面实例上
      this.orderNo = res.data
      // 获取预付单信息
      this.advancePay()
    }
  },500),
  // 预支付
  async advancePay () {
    try {
      const payParams = await reqPrePayInfo(this.orderNo)
      if(payParams.code === 200) {
        const payInfo = await wx.requestPayment(payParams.data)
        // console.log(payInfo)
        // 获取支付结果
        if(payInfo.errMsg === 'requestPayment:ok') {
          // 查询支付状态
          const payStatus = await reqPayStatus(this.orderNo)
          if(payStatus.code === 200) {
            wx.redirectTo({
              url: '/modules/orderPayModule/pages/order/list/list',
              success: () => {
                toast({title: '支付成功', icon: 'success'})
              }
            })
          }
        }
      }
    } catch(err) {
      toast({title: '支付失败,请联系客服',icon: 'error'})
    }
  },
  onLoad(options) {
     // 获取立即购买商品传递的参数 赋值给data
     this.setData({
      ...options
    })
  },
  onShow() {
    // 获取地址
    this.getAddress()
    // 获取订单详情
    this.getOrderInfo()
  },
  // 页面销毁后 销毁数据
  onUnload () {
    app.globalData.address = {}
  }
})